﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;

public partial class _InfoConvocados : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["cnpj"] == null || Session["codUsuario"] == null || Session["login"] == null)
            Response.Redirect("Default.aspx");
        else
        {
            if (!Page.IsPostBack)
            {
                #region Carregando informações do inscrito
                DataTable dt = Dao.Instance.SelecionarInscrito(Session["cpfConvocado"].ToString());

                if (dt != null && dt.Rows.Count > 0)
                {
                    this.lblCpfConteudo.Text = Session["cpfConvocado"].ToString();
                    this.lblNomeConteudo.Text = dt.Rows[0]["NomeAluno"].ToString();

                    string telefone = "";
                    if (dt.Rows[0]["Telefone"].ToString() != "")
                        telefone = dt.Rows[0]["Telefone"].ToString();
                    if (dt.Rows[0]["Telefone2"].ToString() != "")
                        telefone += " / " + dt.Rows[0]["Telefone2"].ToString();

                    this.lblTelefoneConteudo.Text = telefone;
                    this.lblEmailConteudo.Text = dt.Rows[0]["Email"].ToString();
                }
                else
                    Response.Redirect("Default.aspx");
                #endregion

                #region Carregar dropdownlist com as vagas do inscrito
                DataTable dtVagas = Dao.Instance.CarregarVagasInscrito(Session["cnpj"].ToString(), Session["cpfConvocado"].ToString());
                this.ddlVagasConvocado.DataSource = dtVagas;
                this.ddlVagasConvocado.DataValueField = "pkIdVaga_Inscritos";
                this.ddlVagasConvocado.DataTextField = "ocupacao";
                this.ddlVagasConvocado.DataBind();
                #endregion

                #region Carregar informações opções questionário
                DataTable dtOpcoes = Dao.Instance.CarregarOpcoesQuestionario();
                this.rblOpcoesQuestionario.DataSource = dtOpcoes;
                this.rblOpcoesQuestionario.DataValueField = "pkIdQuestionarioEmpresaOpcoes";
                this.rblOpcoesQuestionario.DataTextField = "descricaoOpcoes";
                this.rblOpcoesQuestionario.DataBind();
                #endregion
            }
        }
    }

    protected void ddlVagasConvocado_SelectedIndexChanged(object sender, EventArgs e)
    {
        //-1 representa exisitr algo selecionado dentro do componente
        if (ddlVagasConvocado.SelectedValue != "-1")
        {
            this.divEntrevista.Visible = true;
            this.divQuestionario.Visible = false;
            this.divResultadoSelecao.Visible = true;

            #region Carregando informações da entrevista
            DataTable dtVagas = Dao.Instance.CarregarEntrevistaInscrito(Session["cnpj"].ToString(), Session["cpfConvocado"].ToString(), this.ddlVagasConvocado.SelectedValue);

            this.lblDtEntrevistaConteudo.Text = dtVagas.Rows[0]["dataEntrevista"].ToString();
            this.lblHorarioEntrevistaConteudo.Text = dtVagas.Rows[0]["horarioEntrevista"].ToString();
            this.lblContatoEntrevistaConteudo.Text = dtVagas.Rows[0]["contato"].ToString();
            this.lblEmailEntrevistaConteudo.Text = dtVagas.Rows[0]["email"].ToString();
            this.lblTelefoneEntrevistaConteudo.Text = dtVagas.Rows[0]["telefone"].ToString();

            string endereco = dtVagas.Rows[0]["endereco"].ToString() +  ", " + dtVagas.Rows[0]["numero"].ToString() + ", " +
                              dtVagas.Rows[0]["bairroDistrito"].ToString() + " - " + dtVagas.Rows[0]["municipio"].ToString() + ", CEP: " + dtVagas.Rows[0]["cep"].ToString();

            this.txtLocalEntrevistaConteudo.Text = endereco;
            #endregion
        }
        else//Caso a opção selecionada seja a opção em 'Branco'
        {
            this.divEntrevista.Visible = false;
            this.divQuestionario.Visible = false;
            this.divResultadoSelecao.Visible = false;
        }

        this.divOutraOcupacao.Visible = false;
        this.rblOcupacao.SelectedIndex = 0;
        this.txtDtAdmissao.Text = "";
        this.txtOcupacao.Text = "";
        this.divNaoConvocado.Visible = false;
        this.rblOpcoesQuestionario.ClearSelection();
        this.divTxtObservacoes.Visible = false;
        this.txtObservacoes.Text = "";
    }

    protected void rblOcupacao_SelectedIndexChanged(Object sender, EventArgs e)
    {
        switch (this.rblOcupacao.SelectedValue)
	    {
            case "0"://Na Ocupação

                this.divDtAdmissao.Visible = true;
                this.divOutraOcupacao.Visible = false;
                this.divNaoConvocado.Visible = false;

                break;
            case "1"://Em Outra Ocupação

                this.divDtAdmissao.Visible = true;
                this.divOutraOcupacao.Visible = true;
                this.divNaoConvocado.Visible = false;
                
                break;
            case "2"://Não convocado

                this.divDtAdmissao.Visible = false;
                this.divOutraOcupacao.Visible = false;
                this.divNaoConvocado.Visible = true;
                
                break;
	    }

        this.txtDtAdmissao.Text = "";
        this.txtOcupacao.Text = "";
        this.rblOpcoesQuestionario.SelectedIndex = -1;
    }

    protected void ResultadoSelecao_Click(Object sender, EventArgs e)
    {
        if (this.divQuestionario.Visible == true)
        {
            this.divQuestionario.Visible = false;
            this.divDtAdmissao.Visible = false;
            this.divNaoConvocado.Visible = false;
            this.divOutraOcupacao.Visible = true;
        }
        else
        {
            this.rblOcupacao.SelectedIndex = 0;
            this.divQuestionario.Visible = true;
            this.divDtAdmissao.Visible = true;
            this.divOutraOcupacao.Visible = false;
        }
    }

    protected void rblOpcoesQuestionario_SelectedIndexChanged(Object sender, EventArgs e)
    {
        if (this.rblOpcoesQuestionario.SelectedValue == "10")
            this.divTxtObservacoes.Visible = true;
        else
            this.divTxtObservacoes.Visible = false;
    }

    protected void SqlvarQuestionario_Click(object sender, EventArgs e)
    {
        try
        {
            string ocupacaoSelecionada = this.rblOcupacao.SelectedValue;
            bool passouValidacao = false;

            //Validando de acordo com a opção escolhida
            switch (ocupacaoSelecionada)
            {
                case "0"://Na Ocupação

                    DateTime dt = new DateTime();

                    if (!DateTime.TryParse(this.txtDtAdmissao.Text, out dt))
                        ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('Data no formato inválido!');", true);
                    else if (dt > DateTime.Now)
                        ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('A data não pode ser maior que a data atual!');", true);
                    else
                        passouValidacao = true;

                    break;
                case "1"://Em Outra Ocupação
                    
                    DateTime dtOutraOcup = new DateTime();

                    if (!DateTime.TryParse(this.txtDtAdmissao.Text, out dtOutraOcup))
                        ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('Data no formato inválido!');", true);
                    else if (dtOutraOcup > DateTime.Now)
                        ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('A data não pode ser maior que a data atual!');", true);
                    else if (this.txtOcupacao.Text.Equals(""))
                        ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('Preencha qual a ocupação!!');", true);
                    else
                        passouValidacao = true;

                    break;
                case "2"://Não convocado

                    if (this.rblOpcoesQuestionario.SelectedIndex == -1)
                        ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('Selecione uma justificativa para a opção Não convocado!');", true);
                    else if (this.rblOpcoesQuestionario.SelectedIndex == 10 && this.txtObservacoes.Text.Equals(""))//Referente a opção 'Observações'
                        ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('Campo referente a observações está vazio!');", true);
                    else
                        passouValidacao = true;

                    break;
            }

            if (passouValidacao)
            {
                DateTime dt = new DateTime();
                if (this.txtDtAdmissao.Text != "")
                    dt = Convert.ToDateTime(this.txtDtAdmissao.Text);

                bool questSalvo = false;

                switch (ocupacaoSelecionada)
                {
                    case "0"://Na Ocupação
                        questSalvo = Dao.Instance.SalvarQuestionario("0", dt, "", "", "", Session["codUsuario"].ToString(), this.ddlVagasConvocado.SelectedValue);
                        break;
                    case "1"://Em Outra Ocupação
                        questSalvo = Dao.Instance.SalvarQuestionario("1", dt, this.txtOcupacao.Text, "", "", Session["codUsuario"].ToString(), this.ddlVagasConvocado.SelectedValue);
                        break;
                    case "2"://Não convocado
                        questSalvo = Dao.Instance.SalvarQuestionario("2", dt, "", this.rblOpcoesQuestionario.SelectedValue, this.txtObservacoes.Text, Session["codUsuario"].ToString(), this.ddlVagasConvocado.SelectedValue);
                        break;
                }

                if (questSalvo)
                {
                    #region Carregar dropdownlist com as vagas do inscrito, agora sem a vaga que já tem questionário
                    this.ddlVagasConvocado.Items.Clear();
                    this.ddlVagasConvocado.Items.Add(new ListItem("", "-1"));

                    DataTable dtVagas = Dao.Instance.CarregarVagasInscrito(Session["cnpj"].ToString(), Session["cpfConvocado"].ToString());
                    this.ddlVagasConvocado.DataSource = dtVagas;
                    this.ddlVagasConvocado.DataValueField = "pkIdVaga_Inscritos";
                    this.ddlVagasConvocado.DataTextField = "ocupacao";
                    this.ddlVagasConvocado.DataBind();
                    #endregion

                    this.ddlVagasConvocado.SelectedIndex = 0;
                    this.divEntrevista.Visible = false;
                    this.divResultadoSelecao.Visible = false;
                    this.divQuestionario.Visible = false;

                    ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('Questionário preenchido com sucesso');", true);
                }
                else
                    ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "alert('Ocorreu algum problema ao salvar o questionário...');", true);
            }
        }
        catch (Exception exc)
        {
            throw new Exception(exc.Message);
        }
    }
}

public class Dao
{
    #region Singleton
    private static Dao instance;

    private Dao() { }

    public static Dao Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Dao();
            }
            return instance;
        }
    }
    #endregion

    public DataTable SelecionarInscrito(string cpf)
    {
        SqlCommand command = new SqlCommand("SELECT * FROM CamaraInscritos WHERE cpf = @cpf");
        command.Parameters.Add(new SqlParameter("cpf", cpf));
        return executarQuery(command);
    }

    public DataTable CarregarVagasInscrito(string cnpj, string cpf)
    {
        string sql = "SELECT * FROM CamaraEmpresas emp INNER JOIN CamaraCVVaga vg ON emp.cnpj = vg.fkCnpjEmpresa " +
                                                      "INNER JOIN CamaraVaga_Inscritos vginsc ON vg.pkIdVaga = vginsc.fkIdVaga " +
                                                      "INNER JOIN CamaraInscritos insc ON vginsc.fkIdInscrito = insc.cpf " +
                     "WHERE emp.cnpj = @cnpj AND insc.cpf = @cpf AND vg.vagaAtiva = 1 AND vginsc.fkIdQuestEmpresa IS NULL";
        SqlCommand command = new SqlCommand(sql);
        command.Parameters.Add(new SqlParameter("cnpj", cnpj));
        command.Parameters.Add(new SqlParameter("cpf", cpf));

        return executarQuery(command);
    }

    public DataTable CarregarEntrevistaInscrito(string cnpj, string cpf, string idVagaInscritos)
    {
        string sql = "SELECT vginsc.dataEntrevista, vginsc.horarioEntrevista, entrev.contato, entrev.email, " +
                            "entrev.telefone, entrev.endereco, entrev.numero, entrev.bairroDistrito, entrev.municipio, entrev.cep " +
                     "FROM CamaraEmpresas emp INNER JOIN CamaraCVVaga vg ON emp.cnpj = vg.fkCnpjEmpresa " +
                                             "INNER JOIN CamaraVaga_Inscritos vginsc ON vg.pkIdVaga = vginsc.fkIdVaga " +
                                             "INNER JOIN CamaraCVEntrevista entrev ON entrev.fkIdVaga = vg.pkIdVaga " +
                      "WHERE emp.cnpj = @cnpj AND vginsc.fkIdInscrito = @cpf AND vg.vagaAtiva = 1 AND vginsc.pkIdVaga_Inscritos = @idVagaInscritos";

        SqlCommand command = new SqlCommand(sql);
        command.Parameters.Add(new SqlParameter("cnpj", cnpj));
        command.Parameters.Add(new SqlParameter("cpf", cpf));
        command.Parameters.Add(new SqlParameter("idVagaInscritos", idVagaInscritos));

        return executarQuery(command);
    }

    public DataTable CarregarOpcoesQuestionario()
    {
        string sql = "SELECT * FROM CamaraQuestionarioEmpresaOpcoes;";
        SqlCommand command = new SqlCommand(sql);

        return executarQuery(command);
    }

    private void UpdateIdVagaInscrito(string fkIdQuestEmpresa, string pkIdVaga_Inscritos)
    {
        try
        {
            string updateVaga_Inscritos = "UPDATE CamaraVaga_Inscritos SET fkIdQuestEmpresa = @fkIdQuestEmpresa WHERE pkIdVaga_Inscritos = @pkIdVaga_Inscritos";

            SqlCommand commandVgInsc = new SqlCommand(updateVaga_Inscritos);

            commandVgInsc.Parameters.Add(new SqlParameter("fkIdQuestEmpresa", fkIdQuestEmpresa));
            commandVgInsc.Parameters.Add(new SqlParameter("pkIdVaga_Inscritos", pkIdVaga_Inscritos));

            executarQuery(commandVgInsc);
        }
        catch { throw; }
    }

    public bool SalvarQuestionario(string valueOcupacao, DateTime dtAdmissao, string ocupacao, string opcoes, string observacoes, string codUsuario, string pkIdVaga_Inscritos)
    {
        DataTable result = null;

        try
        {
            using (TransactionScope scope = new TransactionScope())
            {
                if (valueOcupacao.Equals("0"))//Na ocupação
                {
                    string insertNaOcup = "INSERT INTO CamaraQuestionarioEmpresa (dataAdmissao, naoConvocado, naOcupacao, outraOcupacao, fkCodUsuario) " +
                                          "VALUES (@dataAdmissao, 0, 1, 0, @fkCodUsuario); SELECT SCOPE_IDENTITY() AS [RetornoId];";
                    SqlCommand commandNaOcup = new SqlCommand(insertNaOcup);

                    commandNaOcup.Parameters.Add(new SqlParameter("dataAdmissao", dtAdmissao));
                    commandNaOcup.Parameters.Add(new SqlParameter("fkCodUsuario", codUsuario));

                    result = executarQuery(commandNaOcup);

                    //Update ID do questionário na tabela CamaraVaga_Inscritos
                    if (result != null && result.Rows.Count > 0)
                    {
                        UpdateIdVagaInscrito(result.Rows[0]["RetornoId"].ToString(), pkIdVaga_Inscritos);

                        scope.Complete();

                        return true;
                    }
                    else { return false; }
                }
                else if (valueOcupacao.Equals("1"))//Em outra ocupação
                {
                    string insertOutraOcup = "INSERT INTO CamaraQuestionarioEmpresa (dataAdmissao, naoConvocado, naOcupacao, outraOcupacao, ocupacao, fkCodUsuario) " +
                                             "VALUES (@dataAdmissao, 0, 0, 1, @ocupacao, @fkCodUsuario); SELECT SCOPE_IDENTITY() AS [RetornoId];";
                    SqlCommand commandOutraOcup = new SqlCommand(insertOutraOcup);

                    commandOutraOcup.Parameters.Add(new SqlParameter("dataAdmissao", dtAdmissao));
                    commandOutraOcup.Parameters.Add(new SqlParameter("ocupacao", ocupacao));
                    commandOutraOcup.Parameters.Add(new SqlParameter("fkCodUsuario", codUsuario));

                    result = executarQuery(commandOutraOcup);

                    //Update ID do questionário na tabela CamaraVaga_Inscritos
                    if (result != null && result.Rows.Count > 0)
                    {
                        UpdateIdVagaInscrito(result.Rows[0]["RetornoId"].ToString(), pkIdVaga_Inscritos);

                        scope.Complete();

                        return true;
                    }
                    else { return false; }
                }
                else if (valueOcupacao.Equals("2"))//Não convocado
                {
                    string insertNaoConvocado = "INSERT INTO CamaraQuestionarioEmpresa (naoConvocado, naOcupacao, outraOcupacao, observacoes, fkIdQuestEmpresaOpcoes, fkCodUsuario) " +
                                                "VALUES (1, 0, 0, @observacoes, @fkIdQuestEmpresaOpcoes, @fkCodUsuario); SELECT SCOPE_IDENTITY() AS [RetornoId];";
                    SqlCommand commandNaoConvocado = new SqlCommand(insertNaoConvocado);

                    commandNaoConvocado.Parameters.Add(new SqlParameter("observacoes", observacoes));
                    commandNaoConvocado.Parameters.Add(new SqlParameter("fkIdQuestEmpresaOpcoes", opcoes));
                    commandNaoConvocado.Parameters.Add(new SqlParameter("fkCodUsuario", codUsuario));

                    result = executarQuery(commandNaoConvocado);

                    //Update ID do questionário na tabela CamaraVaga_Inscritos
                    if (result != null && result.Rows.Count > 0)
                    {
                        UpdateIdVagaInscrito(result.Rows[0]["RetornoId"].ToString(), pkIdVaga_Inscritos);
                        
                        scope.Complete();

                        return true;
                    }
                    else { return false; }
                }
                else
                    return false;
            }
        }
        catch { return false; }
    }

    private DataTable executarQuery(SqlCommand command)
    {
        DataTable dt = new DataTable();
        SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["conexao_intranet"].ConnectionString);

        try
        {
            command.Connection = conn;
            SqlDataAdapter adapter = new SqlDataAdapter(command);
            adapter.Fill(dt);
        }
        catch { throw; }
        finally { conn.Close(); }

        return dt;
    }
}